﻿using System;
using System.Collections.Generic;
using System.Linq;

using Microsoft.AspNet.Membership.OpenAuth;

namespace DemoASPNET.Account
{
  public partial class Manage : System.Web.UI.Page
  {
    protected string SuccessMessage
    {
      get;
      private set;
    }

    protected bool CanRemoveExternalLogins
    {
      get;
      private set;
    }

    protected void Page_Load()
    {
      if (!IsPostBack)
      {
        // Determine the sections to render
        var hasLocalPassword = OpenAuth.HasLocalPassword(User.Identity.Name);
        setPassword.Visible = !hasLocalPassword;
        changePassword.Visible = hasLocalPassword;

        CanRemoveExternalLogins = hasLocalPassword;

        // Render success message
        var message = Request.QueryString["m"];
        if (message != null)
        {
          // Strip the query string from action
          Form.Action = ResolveUrl("~/Account/Manage");

          SuccessMessage =
              message == "ChangePwdSuccess" ? "Your password has been changed."
              : message == "SetPwdSuccess" ? "Your password has been set."
              : message == "RemoveLoginSuccess" ? "The external login was removed."
              : String.Empty;
          successMessage.Visible = !String.IsNullOrEmpty(SuccessMessage);
        }
      }

    }

    protected void setPassword_Click(object sender, EventArgs e)
    {
      if (IsValid)
      {
        var result = OpenAuth.AddLocalPassword(User.Identity.Name, password.Text);
        if (result.IsSuccessful)
        {
          Response.Redirect("~/Account/Manage?m=SetPwdSuccess");
        }
        else
        {

          ModelState.AddModelError("NewPassword", result.ErrorMessage);

        }
      }
    }


    public IEnumerable<OpenAuthAccountData> GetExternalLogins()
    {
      var accounts = OpenAuth.GetAccountsForUser(User.Identity.Name);
      CanRemoveExternalLogins = CanRemoveExternalLogins || accounts.Count() > 1;
      return accounts;
    }

    public void RemoveExternalLogin(string providerName, string providerUserId)
    {
      var m = OpenAuth.DeleteAccount(User.Identity.Name, providerName, providerUserId)
          ? "?m=RemoveLoginSuccess"
          : String.Empty;
      Response.Redirect("~/Account/Manage" + m);
    }


    protected static string ConvertToDisplayDateTime(DateTime? utcDateTime)
    {
      // You can change this method to convert the UTC date time into the desired display
      // offset and format. Here we're converting it to the server timezone and formatting
      // as a short date and a long time string, using the current thread culture.
      return utcDateTime.HasValue ? utcDateTime.Value.ToLocalTime().ToString("G") : "[never]";
    }
  }
}